热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

货位|多种_OracleMobileWebApplication(MWA)学习小结客户化案例

篇首语:本文由编程笔记#小编为大家整理,主要介绍了OracleMobileWebApplication(MWA)学习小结-客户化案例相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Oracle Mobile Web Application (MWA) 学习小结- 客户化案例相关的知识,希望对你有一定的参考价值。



开发环境应注意问题

安装JDK,并配置JAVA环境变量JAVA_HOME


同时需要申请一个访问EBS服务器的端口。
(注:端口可用别人已申请好了的也可自己再申请新的)
申请端口:mwactl.sh -login apps/apps start 11444
关闭端口:mwactl.sh -login apps/apps stop_force 11444


安装JDeveloper 12c

根据EBS版本,在Metalink上找到合适的JDeveloper版本,与OAF开发共用 JDeveloper,这里JDeveloper安装包为fmw_12.1.3.0.0_soa_quickstart.jar。


设置环境变量JDEV_USER_HOME

JDeveloper安装后启动JDeveloper,在非主目录下的其他路径中找到JDeveloper解压后的子路径\\jdevhome\\jdev子路径\\jdevhome\\jdev

如果Win7/8出现显示异常,需要jdevbin\\jdev\\bin 下的 jdev.conf 配置文件,将以下 注释项去掉,AddVMOption -Dsun.java2d.noddraw=true。


必需Java库及JDBC库文件打包

在EBS服务器中打包需要的JAVA库,命令如下:

cd $JAVA_TOP
jar -cvf mwa.jar oracle/apps/mwa
jar -cvf fnd.jar oracle/apps/fnd
jar -cvf wms.jar oracle/apps/wms
jar -cvf inv.jar oracle/apps/inv

打包完后该目录下的情况:

将打包好的JAVA文件下载到本地。
安装Oracle主目录 下oracle_common\\rda\\da\\lib里面就有多种jdbc库文件,使用ojdbc14.jar。


MWA客户化案例

案例Demo演示案例


创建MWA工程

打开JDeveloper,点击File >New >Applications

点击OK,编辑Application Name

点击Next,编辑Project Name

点击Finish。


加载库文件

双击项目MWADemoProject,并导航到Libraries and
Classpath。点击Add Library 和Add Jar/Directory ,分别加入之前打包好的Jar文件和jdbc库文件。


Function 开发


创建Function文件

右键项目MWADemoProject,选择New -> Java Class

点击OK


修改DemoFunction文件中代码

package oracle.apps.cux.demo_11175.server;
import oracle.apps.inv.utilities.server.OrgFunction;
public class DemoFunction extends OrgFunction
public DemoFunction()
super();
setFirstPageName("oracle.apps.cux.demo_11175.server.DemoPage");
addListener(this);


Page开发


创建Page文件

与创建Function文件的方法一样

修改如下信息:
Name: DemoPage
Package: oracle.apps.cux.demo_11175.server


修改DemoPage文件中代码

package oracle.apps.cux.demo_11175.server;
import java.sql.SQLException;
import oracle.apps.inv.utilities.server.UtilFns;
import oracle.apps.mwa.beans.ButtonFieldBean;
import oracle.apps.mwa.beans.LOVFieldBean;
import oracle.apps.mwa.beans.PageBean;
import oracle.apps.mwa.beans.TextFieldBean;
import oracle.apps.mwa.container.MWALib;
import oracle.apps.mwa.container.Session;
import oracle.apps.mwa.eventmodel.MWAEvent;
import oracle.apps.mwa.eventmodel.MWAPageListener;
public class DemoPage extends PageBean implements MWAPageListener
public DemoPage(Session paramSession)
setSession(paramSession);
initLayouts();
initPrompts();
initListeners();


private void initLayouts()
private void initPrompts()
private void initListeners()
public void pageEntered(MWAEvent mwaEvent)
public void pageExited(MWAEvent mwaEvent)
public void specialKeyPressed(MWAEvent mwaEvent)

实现界面布局

private TextFieldBean subinvField;
private TextFieldBean locatorField;
private LOVFieldBean itemLovField;
private TextFieldBean itemDespField;
private ButtonFieldBean confirmButton;
private ButtonFieldBean cancleButton;
private void initLayouts()
this.subinvField = new TextFieldBean();
this.subinvField.setName("SUBINV");
this.subinvField.setRequired(true);
this.locatorField = new TextFieldBean();
this.locatorField.setName("LOCATOR");
this.locatorField.setRequired(false);
this.itemLovField = new LOVFieldBean();
this.itemLovField.setName("ITEM");
this.itemLovField.setRequired(true);
this.itemLovField.setlovStatement("cux_11175_mwa_demo_pkg.get_item_lov");
String[] itemLovInputParams = "","ORGID","oracle.apps.cux.demo_11175.server.DemoPage.SUBINV","oracle.apps.cux.demo_11175.server.DemoPage.LOCATOR","oracle.apps.cux.demo_11175.server.DemoPage.ITEM";
this.itemLovField.setInputParameters(itemLovInputParams);
this.itemLovField.setInputParameterTypes(new String[] "C","N", "S", "S", "S" );
this.itemLovField.setSubfieldDisplays(new boolean[] false, true, true);
this.itemLovField.setSubfieldPrompts(new String[] "a", "物料编码", "物料说明" );
this.itemDespField = new TextFieldBean();
this.itemDespField.setName("ITEMDESP");
this.itemDespField.setRequired(false);
this.itemDespField.setEditable(false);

this.confirmButton = new ButtonFieldBean();
this.confirmButton.setName("CONFIRM");
this.confirmButton.setNextPageName("oracle.apps.cux.demo_11175.server.DemoPage");
this.cancleButton = new ButtonFieldBean();
this.cancleButton.setName("CANCEL");
this.cancleButton.setNextPageName("|END_OF_TRANSACTION|");
this.cancleButton.setEnableAcceleratorKey(true);
addFieldBean(this.subinvField);
addFieldBean(this.locatorField);
addFieldBean(this.itemLovField);
addFieldBean(this.itemDespField);
addFieldBean(this.confirmButton);
addFieldBean(this.cancleButton);


物料LOV

SELECT msiv.inventory_item_id,
msiv.concatenated_segments,
msiv.description
FROM mtl_system_items_vl msiv
WHERE msiv.organization_id = 组织ID
AND msiv.concatenated_segments LIKE 物料编码|| '%'
AND EXISTS
(SELECT 1
FROM mtl_onhand_quantities_detail hoqd,
mtl_item_locations_kfv mil
WHERE hoqd.organization_id = msiv.organization_id
AND hoqd.inventory_item_id = msiv.inventory_item_id
AND hoqd.subinventory_code = 子库存编码
AND hoqd.organization_id = mil.organization_id
AND hoqd.locator_id = mil.inventory_location_id
AND nvl(mil.concatenated_segments, '9999') = nvl(货位编码,nvl(mil.concatenated_segments,'9999')));

PageListener实现

private void clears()
if (UtilFns.isTraceOn) UtilFns.trace("In DemoPage clears()");
this.subinvField.setValue("");
this.locatorField.setValue("");
this.itemLovField.setValue("");
this.itemDespField.setValue("");
if (UtilFns.isTraceOn) UtilFns.trace("In DemoPage clears()");

public void pageEntered(MWAEvent mwaEvent)
clears();

Page标题和字段提示


  1. 标题和提示信息AK属性(下面只列出需要设置的AK属性清单,详细的设置步骤 请参考《信息技术最佳实践-Oracle MWA 技术总结.pdf》)
    属性定义和在区域中维护属性
  2. 在Page代码实现获取并设置标题和提示

private void initPrompts()
if (UtilFns.isTraceOn) UtilFns.trace("In DemoPage initPrompts()");

try
setPrompt(MWALib.getAKPrompt(getSession(),"cux.oracle.apps.wms.utilities.CuxWmsResourceTable", "CUX_DEMO_TITLE") + "(" +getSession().getObject("ORGCODE") + ")");

this.subinvField.setPrompt(MWALib.getAKPrompt(getSession(), "cux.oracle.apps.wms.utilities.CuxWmsResourceTable", "CUX_SUBINVENTORY_PROMPT"));
this.locatorField.setPrompt(MWALib.getAKPrompt(getSession(), "cux.oracle.apps.wms.utilities.CuxWmsResourceTable","CUX_LOCATOR_PROMPT"));
this.itemLovField.setPrompt(MWALib.getAKPrompt(getSession(),"cux.oracle.apps.wms.utilities.CuxWmsResourceTable", "CUX_ITEM_PROMPT"));
this.itemDespField.setPrompt(MWALib.getAKPrompt(getSession(), "cux.oracle.apps.wms.utilities.CuxWmsResourceTable", "CUX_ITEM_DESC_PROMPT"));
this.confirmButton.setPrompt(MWALib.getAKPrompt(getSession(), "cux.oracle.apps.wms.utilities.CuxWmsResourceTable","CUX_CONFIRM_PROMPT"));
this.cancleButton.setPrompt(MWALib.getAKPrompt(getSession(), "cux.oracle.apps.wms.utilities.CuxWmsResourceTable", "CUX_CANCEL_PROMPT"));

catch (SQLException e)
if (UtilFns.isTraceOn) UtilFns.trace("In DemoPage initPrompts() --exception:" + e.getMessage());


if (UtilFns.isTraceOn) UtilFns.trace("Out DemoPage initPrompts()");


FieldListener开发


创建Listener文件

与创建Function文件的方法一样

修改如下信息:
Name: DemoListener
Package: oracle.apps.cux.demo_11175.server


修改DemoListener文件中代码

package oracle.apps.cux.demo_11175.server;
import oracle.apps.mwa.beans.FieldBean;
import oracle.apps.mwa.container.Session;
import oracle.apps.mwa.eventmodel.AbortHandlerException;
import oracle.apps.mwa.eventmodel.DefaultOnlyHandlerException;
import oracle.apps.mwa.eventmodel.InterruptedHandlerException;
import oracle.apps.mwa.eventmodel.MWAEvent;
import oracle.apps.mwa.eventmodel.MWAFieldListener;
public class DemoListener implements MWAFieldListener
private DemoPage curPage = null;
private Session session = null;

public DemoListener(DemoPage demoPage)
this.curPage = demoPage;
this.session = this.curPage.getSession();


public void fieldEntered(MWAEvent mwaEvent) throws AbortHandlerException, InterruptedHandlerException, DefaultOnlyHandlerException

public void fieldExited(MWAEvent mwaEvent) throws AbortHandlerException, InterruptedHandlerException, DefaultOnlyHandlerException


实现验证字段值

在DemoListener文件中验证各字段值

import java.sql.Connection;
import java.sql.SQLException;
import oracle.apps.inv.utilities.server.UtilFns;
import oracle.apps.mwa.beans.FieldBean;
import oracle.jdbc.OracleCallableStatement;
public void fieldExited(MWAEvent mwaEvent) throws AbortHandlerException, InterruptedHandlerException, DefaultOnlyHandlerException
String fieldName = ((FieldBean) mwaEvent.getSource()).getName();
String action = mwaEvent.getAction();
if (UtilFns.isTraceOn) UtilFns.trace("DemoListener:fieldExited for" + fieldName + ",action is " + action);
if ((action.equals("MWA_SUBMIT")) || (action.equals("MWA_NEXTFIELD")))
if (fieldName.equals(this.curPage.getSubinvField().getName()))
subinvExited();
else if (fieldName.equals(this.curPage.getLocatorField().getName()))
locatorExited();
else if (fieldName.equals(this.curPage.getItemLovField().getName()))
itemExited();

private void subinvExited() throws AbortHandlerException
Long organizationId = Long.valueOf(Long.parseLong(this.session.getObject("ORGID").toString()));
String subinvCode = this.curPage.getSubinvField().getValue();

Connection localConnection = this.session.getConnection();
OracleCallableStatement localOracleCallableStatement = null;
try
if (UtilFns.isTraceOn)
UtilFns.trace("calling cux_11175_mwa_demo_pkg.validate_subinv with organizationId:" + organizationId);
UtilFns.trace("calling cux_11175_mwa_demo_pkg.validate_subinv with subinvCode:" + subinvCode);

localOracleCallableStatement = (OracleCallableStatement) localConnection.prepareCall("call cux_11175_mwa_demo_pkg.validate_subinv(:1,:2,:3,:4,:5)");
localOracleCallableStatement.registerOutParameter(1, 12, 0, 10);
localOracleCallableStatement.registerOutParameter(2, 2);
localOracleCallableStatement.registerOutParameter(3, 12, 0, 4000);
localOracleCallableStatement.setLong(4, organizationId.longValue());
localOracleCallableStatement.setString(5, subinvCode);
localOracleCallableStatement.executeQuery();

String returnStatus = localOracleCallableStatement.getString(1);
String returnMsg = localOracleCallableStatement.getString(3);

if (returnStatus.equalsIgnoreCase("S"))
if (UtilFns.isTraceOn)
UtilFns.trace("Success from validate_subinv Transaction Number:" + subinvCode);
else
this.session.setStatusMessage(returnMsg);
if (UtilFns.isTraceOn)
UtilFns.trace("Failure from validate_subinv:" + returnMsg);


try
if (localOracleCallableStatement != null)
localOracleCallableStatement.close();
catch (SQLException e)
if (UtilFns.isTraceOn)
UtilFns.trace("Exception when closing localOracleCallableStatement" + e.getMessage());
throw new AbortHandlerException("Exception when closing localOracleCallableStatement");

catch (Exception localSQLException)
throw new AbortHandlerException("SQL error validate_subinv ");
finally
try
if (localOracleCallableStatement != null)
localOracleCallableStatement.close();
catch (SQLException e)

if (UtilFns.isTraceOn) UtilFns.trace("Exception when closing localOracleCallableStatement " + e.getMessage());
throw new AbortHandlerException("Exception when closing localOracleCallableStatement");



private void locatorExited() throws AbortHandlerException
Long organizationld = Long.valueOf(Long.parseLong(this.session.getObject("ORGID").toString()));
String subinvCode = this.curPage.getSubinvField().getValue();
String locatorCode = this.curPage.getLocatorField().getValue();

Connection localConnection = this.session.getConnection();
OracleCallableStatement loraclecallablestatment = null;
try
if (UtilFns.isTraceOn)
UtilFns.trace("calling cux_11175_mwa_demo_pkg.validate_locator with organizationId:" + organizationld);
UtilFns.trace("calling cux_11175_mwa_demo_pkg.validate_locator with subinvCode:" + subinvCode);
UtilFns.trace("calling cux_11175_mwa_demo_pkg.validate_locator with lcaotorCode:" + locatorCode);

loraclecallablestatment = (OracleCallableStatement) localConnection.prepareCall("call cux_11175_mwa_demo_pkg.validate_locator(:1,:2,:3,:4,:5,:6)");
loraclecallablestatment.registerOutParameter(1, 12, 0, 10);
loraclecallablestatment.registerOutParameter(2,2);
loraclecallablestatment.registerOutParameter(3, 12, 0, 4000);
loraclecallablestatment.setLong(4,organizationld.longValue());
loraclecallablestatment.setString(5, subinvCode);
loraclecallablestatment.setString(6, locatorCode);
loraclecallablestatment.executeQuery();
String returnStatus = loraclecallablestatment.getString(1);
String returnMsg = loraclecallablestatment.getString(3);
if (returnStatus.equalsIgnoreCase("S"))
if (UtilFns.isTraceOn)
UtilFns.trace("Success from validate_subinv Transaction Number:" + subinvCode);
else
this.session.setStatusMessage(returnMsg);
if (UtilFns.isTraceOn)
UtilFns.trace("Failure from validate_subinv:" + returnMsg);


try
if (loraclecallablestatment != null)
loraclecallablestatment.close();
catch (SQLException e)
if (UtilFns.isTraceOn)
UtilFns.trace("Exception when closing localOracleCallableStatement" + e.getMessage());

throw new AbortHandlerException("Exception when closing localOracleCallableStatement");

catch (Exception localSQLException)
throw new AbortHandlerException("SQL error validate_subinv ");
finally
try
if (loraclecallablestatment != null)
loraclecallablestatment.close();
catch (SQLException e)
if (UtilFns.isTraceOn)
UtilFns.trace("Exception when closing localOracleCallableStatement " + e.getMessage());

throw new AbortHandlerException("Exception when closing localOracleCallableStatement");



private void itemExited() throws AbortHandlerException
if (this.curPage.getItemLovField().isPopulated())
this.curPage.getItemDespField().setValue(this.curPage.getItemLovField().getSelectedValues().elementAt(2).toString());


验证字段值SQL语句

验证子库信息

SELECT COUNT(1)
FROM mtl_secondary_inventories msi
WHERE msi.organization_id = 组织ID
AND msi.secondary_inventory_name = 子库编码

验证货位信息

SELECT COUNT(1)
FROM mtl_item_locations_kfv mil
WHERE mil.organization_id = 组织ID
AND mil.subinventory_code = 子库编码
AND mil.concatenated_segments = 货位编码;

在Page代码实现获取相应字段值

注:一定要初始化FieldListener,否则将不会执行字段验证相关函数

private DemoListener mListener = null;
private void initListeners()
this.mListener = new DemoListener(this);

this.subinvField.addListener(this.mListener);
this.locatorField.addListener(this.mListener);
this.itemLovField.addListener(this.mListener);
this.confirmButton.addListener(this.mListener);
this.cancleButton.addListener(this.mListener);
addListener(this);

public void setSubinvField(TextFieldBean subinvField)
this.subinvField = subinvField;

public TextFieldBean getSubinvField()
return this.subinvField;


public void setItemLovField(LOVFieldBean itemLovField)
this.itemLovField = itemLovField;

public LOVFieldBean getItemLovField()
return this.itemLovField;


public void setItemDespField(TextFieldBean itemDespField)
this.itemDespField = itemDespField;

public TextFieldBean getItemDespField()
return this.itemDespField;

public void setLocatorField(TextFieldBean locatorField)
this.locatorField = locatorField;

public TextFieldBean getLocatorField()
return this.locatorField;


发布到EBS


编译、上传

1、 右键MWAAppDemo.jws或MWAAppDemo.jpr,Rebuild
2、 将\\mywork\\MWAAppDemo\\MWADemoProject\\Classes/oracle/apps/cux/demo_11175
上传到服务器$JAVA_TOP//oracle/apps/cux/demo_11175
3、 修改目录属性,cd $JAVA_TOP后运行:chmod -R 775 hand


重启服务

在打开MWA客户端之前,需要重启端口;在MWA开发过程中,任何修改都需要重启端口才能生效

cd $ADMIN_SCRIPTS_HOME
mwactl.sh –login apps/apps stop_force 11444
mwactl.sh –login apps/apps start 11444 


定义功能菜单

在EBS中创建演示的用户,职责和菜单

与挂form方式一样,注意个别选项的值即可。

特性菜单下
类型:移动应用产品

Webhtml菜单下
HTML调用:oracle.apps.cux.demo_11175.server.DemoFunction

然后将功能挂到对应需求的菜单和职责之下。


启动MWA


新建connect



登陆EBS系统



测试数据



推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 如何基于ggplot2构建相关系数矩阵热图以及一个友情故事
    本文介绍了如何在rstudio中安装ggplot2,并使用ggplot2构建相关系数矩阵热图。同时,通过一个友情故事,讲述了真爱难觅的故事背后的数据量化和皮尔逊相关系数的概念。故事中的小伙伴们在本科时参加各种考试,其中有些沉迷网络游戏,有些热爱体育,通过他们的故事,展示了不同兴趣和特长对学习和成绩的影响。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
author-avatar
mobiledu2502872237
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有